# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
from mpl_toolkits import mplot3d
import talib

# 设置matplotlib正常显示中文和负号
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 用黑体显示中文
matplotlib.rcParams['axes.unicode_minus'] = False  # 正常显示负号
# 随机生成（10000,）服从正态分布的数据
# data = np.random.randn(10000)
"""
绘制直方图
data:必选参数，绘图数据
bins:直方图的长条形数目，可选项，默认为10
normed:是否将得到的直方图向量归一化，可选项，默认为0，代表不归一化，显示频数。normed=1，表示归一化，显示频率。
facecolor:长条形的颜色
edgecolor:长条形边框的颜色
alpha:透明度
"""


def 显示K线在MA两侧的分布情况(close_data=None, 周期=60):
    MA = talib.MA(close_data, timeperiod=周期)
    print(len(MA), len(close_data))

    K线在MA两侧的分布情况 = []
    for i in range(len(close_data)):
        if i < 周期: continue
        K线在MA两侧的分布情况.append(close_data[i] - MA[i])

    plt.hist(K线在MA两侧的分布情况, bins=200, facecolor="blue", edgecolor="black", alpha=0.7)
    # 显示横轴标签
    plt.xlabel("区间")
    # 显示纵轴标签
    plt.ylabel("频数/频率")
    # 显示图标题
    plt.title("K线在MA两侧的分布情况")
    plt.show()


def 模板(close_data=None, 周期=60):
    plt.hist(close_data, bins=200, facecolor="blue", edgecolor="black", alpha=0.7)
    # 显示横轴标签
    plt.xlabel("区间")
    # 显示纵轴标签
    plt.ylabel("频数/频率")
    # 显示图标题
    plt.title("近期价位统计")
    plt.show()


def 显示在指定周期的均线蜡烛线相交的情况(data=None, 周期=60):
    # 如果最高值和最低值没有相交的话就算是了

    MA = talib.MA(data['close'], timeperiod=周期)
    K线在MA两侧的分布情况 = []

    for i in range(len(data)):
        if data['low'][i] < MA[i] and data['high'][i] > MA[i]:
            # 如果指定周期的均线分钟蜡烛线相交
            # print('如果指定周期的均线分钟蜡烛线相交')
            K线在MA两侧的分布情况.append(data['close'][i] - MA[i])

    close_data = []
    plt.hist(K线在MA两侧的分布情况, bins=200, facecolor="blue", edgecolor="black", alpha=0.7)
    # 显示横轴标签
    plt.xlabel("区间")
    # 显示纵轴标签
    plt.ylabel("频数/频率")
    # 显示图标题
    plt.title("在指定周期的均线分钟蜡烛线相交的情况")
    plt.show()


def 显示震荡的周期是多少(data=None, 周期=60):
    # 如果最高值和最低值没有相交的话就算是了

    MA = talib.MA(data['close'], timeperiod=周期)

    周期集合 = []
    连续性 = 0
    for i in range(len(data)):
        if data['low'][i] < MA[i] and data['high'][i] > MA[i]:
            # 如果指定周期的均线分钟蜡烛线相交
            print('显示震荡的周期是多少')
            周期集合.append(连续性)
            连续性 = 0
            continue
        连续性 += 1

    close_data = []
    plt.hist(周期集合, bins=200, facecolor="blue", edgecolor="black", alpha=0.7)
    # 显示横轴标签
    plt.xlabel("区间")
    # 显示纵轴标签
    plt.ylabel("频数/频率")
    # 显示图标题
    plt.title("显示震荡的周期是多少")
    plt.show()


def 显示偏离MA的震荡周期内的最极值是多少(data=None, 周期=60):
    "与均线相交了，看看到下一次相交的极值是多少"

    MA = talib.MA(data['close'], timeperiod=周期)
    K线在MA两侧的极值 = []

    极值 = data['close'][0]
    for i in range(len(data)):
        if data['low'][i] < MA[i] and data['high'][i] > MA[i]:
            # 如果指定周期的均线分钟蜡烛线相交
            # print('如果指定周期的均线分钟蜡烛线相交')
            K线在MA两侧的极值.append(极值)

            continue
        if data['low'][i] > MA[i]:
            极值 = data['high'][i]
        elif data['high'][i] < MA[i]:
            极值 = data['low'][i]

    close_data = []
    plt.hist(K线在MA两侧的极值, bins=200, facecolor="blue", edgecolor="black", alpha=0.7)
    # 显示横轴标签
    plt.xlabel("区间")
    # 显示纵轴标签
    plt.ylabel("频数/频率")
    # 显示图标题
    plt.title("K线在MA两侧的极值")
    plt.show()


def 显示偏离MA的震荡周期内的最极值是多少折线图(data=None, 周期=60):
    "与均线相交了，看看到下一次相交的极值是多少"

    MA = talib.MA(data['close'], timeperiod=周期)
    K线在MA两侧的极值 = []

    极值 = data['close'][0]
    for i in range(len(data)):
        if data['low'][i] < MA[i] and data['high'][i] > MA[i]:
            # 如果指定周期的均线分钟蜡烛线相交
            # print('如果指定周期的均线分钟蜡烛线相交')
            K线在MA两侧的极值.append(极值)

            continue
        if data['low'][i] > MA[i]:
            极值 = data['high'][i]
        elif data['high'][i] < MA[i]:
            极值 = data['low'][i]

    close_data = []
    plt.plot(K线在MA两侧的极值, )
    # 显示横轴标签
    plt.xlabel("区间")
    # 显示纵轴标签
    plt.ylabel("频数/频率")
    # 显示图标题
    plt.title("K线在MA两侧的极值")
    plt.show()


def 显示偏离MA的震荡周期内的最极值的差值是多少(data=None, 周期=60, 获取数据=0):
    "与均线相交了，看看到下一次相交的极值是多少"

    MA = talib.MA(data['close'], timeperiod=周期)
    K线在MA两侧的极值的差值 = []

    极值 = data['close'][0]
    for i in range(len(data)):
        if data['low'][i] < MA[i] and data['high'][i] > MA[i]:
            # 如果指定周期的均线分钟蜡烛线相交
            # print('如果指定周期的均线分钟蜡烛线相交')
            if i > 周期:
                K线在MA两侧的极值的差值.append(极值 - MA[i])

            continue
        if data['low'][i] > MA[i]:
            极值 = data['high'][i]
        elif data['high'][i] < MA[i]:
            极值 = data['low'][i]

    if 获取数据 != 0:
        return K线在MA两侧的极值的差值
    for i in range(len(data)):
        if data['low'][i] < MA[i] and data['high'][i] > MA[i]:
            # 如果指定周期的均线分钟蜡烛线相交
            # print('如果指定周期的均线分钟蜡烛线相交')
            if i > 周期:
                K线在MA两侧的极值的差值.append(极值 - MA[i])

            continue
        if data['low'][i] > MA[i]:
            极值 = data['high'][i]
        elif data['high'][i] < MA[i]:
            极值 = data['low'][i]

    if 获取数据 != 0:
        return K线在MA两侧的极值的差值

    close_data = []
    plt.hist(K线在MA两侧的极值的差值, bins=200, facecolor="blue", edgecolor="black", alpha=0.7)
    # 显示横轴标签
    plt.xlabel("区间")
    # 显示纵轴标签
    plt.ylabel("频数/频率")
    # 显示图标题
    plt.title("显示偏离MA的震荡周期内的最极值的差值是多少")
    plt.show()


def 显示从开始偏离MA线到最高和收盘的情况(data=None, 周期=60, 获取数=0):
    MA = talib.MA(data['close'], timeperiod=周期)
    开始 = False
    开始分离的收盘价 = 0
    与均线相差的极值 = 0
    结束分离的收盘见 = 0

    偏离MA线到最高和收盘 = []
    极值 = data['close'][0]
    for i in range(周期, len(data)):

        if data['low'][i] < MA[i] and data['high'][i] > MA[i] and 开始 == False:
            # 如果指定周期的均线分钟蜡烛线相交
            # print('如果指定周期的均线分钟蜡烛线相交')
            开始分离的收盘价 = data['close'][i]
            与均线相差的极值 = data['close'][i]
            开始 = True
            continue
        if 与均线相差的极值 > data['close'][i] and 开始分离的收盘价 > data['close'][i]:
            与均线相差的极值 = data['high'][i]
        if 与均线相差的极值 < data['close'][i] and 开始分离的收盘价 < data['close'][i]:
            与均线相差的极值 = data['high'][i]

        if data['low'][i] < MA[i] and data['high'][i] > MA[i] and 开始 == True:
            # 再次与MA线相交
            偏离MA线到最高和收盘.append([开始分离的收盘价, 与均线相差的极值, data['close'][i]])
            开始=False
            # if 获取数据 != 0:
        #     return K线在MA两侧的极值的差值

    print(偏离MA线到最高和收盘)

    # 绘制三角螺旋线
    from mpl_toolkits import mplot3d



    ax = plt.axes(projection='3d')

    # 三维散点的数据
    zdata =  [i[0] for i in 偏离MA线到最高和收盘 ]
    xdata =  [i[1] for i in 偏离MA线到最高和收盘 ]
    ydata =  [i[2] for i in 偏离MA线到最高和收盘 ]
    ax.scatter3D(xdata, ydata, zdata, c=zdata, cmap='Greens')
    plt.show()


    return 偏离MA线到最高和收盘

def 验证MA金叉是否有效(data=None, 周期=60, 获取数=0):
    """
    此方法是用来看每次K线与均线相交后
    :param data:
    :param 周期:
    :param 获取数:
    :return:
    """



